package synchronizedTest;

/**
 * synchronized 如果在方法上表示则代表锁住该对象，也就是同理与synchronize（this）{方法中的所有代码}
 * synchronized 如果在静态方法上则代表锁住该类，也就是同理synchronize（Foo.class）{方法中的所有代码}
 * synchronized(XXX){代码} 如果XXX为同一个对象则任何synchronized申明为XXX的代码块都会被锁住。
 */
public class Main {
    public static void main(String[] args) {
        Foo foo1 = new Foo();
        Foo foo2 = new Foo();
        //测试方法上的synchronized
//        new Thread(()->{
//            foo1.m1();
//        }).start();
//
//        new Thread(()->{
//            foo2.m2();
//        }).start();

        //测试代码中的synchronized
//        new Thread(()->{
//            foo1.m3();
//        }).start();
//
//        new Thread(()->{
//            foo2.m4();
//        }).start();
//
        new Thread(()->{
            foo1.m5();
        }).start();

        new Thread(()->{
            foo2.m6();
        }).start();


        System.out.println("dsasd");
    }
}
